using System;
using System.Collections.Generic;
using System.Text;

using XNAF = Microsoft.Xna.Framework;

using XGAE.Framework;
using XGAE.Framework.Extensions;

namespace XGAE.Framework.Body.Vision
{

    /// <summary>
    /// Sensor queries that gather visible information about the environment's structure.
    /// </summary>
    public interface ISpace
    {
        /// <summary>
        /// Perform a movement simulation in a particular direction.
        /// </summary>
        /// <param name="angle"></param>
        /// <param name="steps"></param>
        /// <returns></returns>
        float TraceWalk(float angle, float steps);

        /// <summary>
        /// Project a small object in a particular direction and return the distance.
        /// </summary>
        /// <param name="orientation"></param>
        /// <returns></returns>
        float TraceLine(XNAF.Vector3 orientation);

        /// <summary>
        /// Determine the restriction of the environment locally by computing the average distance
        /// to obstacles from the current position.
        /// </summary>
        /// <returns></returns>
        float GetSpatialRestriction();
    }

    /// <summary>
    /// Sensor queries that gather visible information about the environment.
    /// </summary>
    public interface ISymbolic
    {
        /// <summary>
        /// Retrieve an array of visible entities.
        /// </summary>
        /// <param name="visible"></param>
        void GetVisibleEntities(List<Entity> visible);

        /// <summary>
        /// Query the situation in space of a particular entity.
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="position"></param>
        /// <returns></returns>
        bool GetPosition(Entity entity, SpheriCoord position);
    }
}